package com.example.stmp.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 字符串转ArrayList<String>的类型处理器
 * 解决MyBatis无法实例化List接口的问题
 */
@MappedTypes(ArrayList.class)  // 明确指定处理ArrayList类型
@MappedJdbcTypes(JdbcType.VARCHAR)
public class StringToListTypeHandler extends BaseTypeHandler<List<String>> {

    // 将ArrayList<String>转换为字符串存入数据库
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null || parameter.isEmpty()) {
            ps.setString(i, "");  // 存储空字符串而非null，避免数据库null值处理问题
        } else {
            String str = String.join(",", parameter);
            ps.setString(i, str);
        }
    }

    // 从数据库读取字符串并转换为ArrayList<String>
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String str = rs.getString(columnName);
        return convertStringToArrayList(str);
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String str = rs.getString(columnIndex);
        return convertStringToArrayList(str);
    }

    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String str = cs.getString(columnIndex);
        return convertStringToArrayList(str);
    }

    // 字符串转ArrayList的辅助方法
    private ArrayList<String> convertStringToArrayList(String str) {
        if (str == null || str.trim().isEmpty()) {
            return new ArrayList<>();
        }
        // 按逗号分割并去除空格，使用ArrayList保证类型一致性
        return new ArrayList<>(Arrays.stream(str.split("\\s*,\\s*"))
                .filter(s -> !s.isEmpty())  // 过滤空字符串
                .toList());
    }
}